home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TeX 1995 July
/
TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO
/
macros
/
latex209
/
contrib
/
slatex
/
defmacro.ss
< prev
next >
Wrap
Text File
|
1993-11-07
|
3KB
|
118 lines
;defmacro.ss
;SLaTeX Version 1.99
;define-macro! for SLaTeX
;(c) Dorai Sitaram, December 1991, Rice University
;define-macro!
'(enable cl)
(defmacro define-macro! z `(defmacro ,@z))
'(enable cscheme)
(syntax-table-define system-global-syntax-table
'define-macro!
(macro defmacargs
(let ((macname (car defmacargs)) (macargs (cadr defmacargs))
(macbdy (cddr defmacargs)))
`(syntax-table-define system-global-syntax-table
',macname
(macro ,macargs ,@macbdy)))))
'(enable elk)
(define-macro (define-macro! key pat . bdy)
`(define-macro ,(cons key pat) ,@bdy))
'(enable schemetoc)
(define-macro define-macro!
(lambda (f e)
(let ((key (cadr f)) (pat (caddr f)) (bdy (cdddr f)))
(e `(define-macro ,key
(lambda (%form% %expr%)
(%expr% (apply (lambda ,pat ,@bdy) (cdr %form%)) %expr%)))
e))))
'(enable scmx)
(define-syntax extend-syntax
(syntax-rules ()
((extend-syntax (macro . keywords) . clauses)
(define-syntax macro
(syntax-rules keywords . clauses)))))
'(enable umbscheme)
(macro define-macro!
(lambda (f)
(let ((key (cadr f)) (pat (caddr f)) (bdy (cdddr f)))
`(macro ,key (lambda (%temp%)
(apply (lambda ,pat ,@bdy) (cdr %temp%)))))))
'(enable) ;alternative for potential dialect
(define-macro define-macro!
(lambda (key pat . bdy)
`(define-macro ,key
(lambda ,pat ,@bdy))))
'(enable) ;alternative for potential dialect
(define-syntax (define-macro! key pat . bdy)
`(define-syntax ,(cons key pat) ,@bdy))
;when
'(enable scmx)
(extend-syntax (when)
((when a . b) (if a (begin . b) 'void)))
'(disable chez cl elk scmx)
(define-macro! when (a . b)
`(if ,a (begin ,@b) 'void))
;unless
'(enable scmx)
(extend-syntax (unless)
((unless a . b) (if a 'void (begin . b))))
'(disable chez cl elk scmx)
(define-macro! unless (a . b)
`(if ,a 'void (begin ,@b)))
;gensym
'(disable chez cl)
(define gensym
(let ((n -1))
(lambda ()
;generates an allegedly new symbol;
;this is a gross hack since there is no standardized way of
;getting uninterned symbols
(set! n (+ n 1))
(string->symbol (string-append "#:g%" (number->string n) "%")))))
;fluid-let
'(enable cl)
(define-macro! fluid-let (let-pairs . body)
`(let ,let-pairs
(declare (special ,@(map car let-pairs)))
,@body))
'(enable scmx)
(extend-syntax (fluid-let) ;caveat: this is really fluid-let*
((fluid-let () . body) (begin . body))
((fluid-let ((x v) . more-let-pairs) . body)
(let ((%tmp x))
(set! x v)
(let ((%ans (fluid-let more-let-pairs . body)))
(set! x %tmp)
%ans))))
'(disable chez cl cscheme elk scmx)
(define-macro! fluid-let (let-pairs . b)
(let ((x-s (map car let-pairs))
(i-s (map cadr let-pairs))
(old-x-s (map (lambda (p) (gensym)) let-pairs)))
`(let ,(map (lambda (old-x x) `(,old-x ,x)) old-x-s x-s)
,@(map (lambda (x i) `(set! ,x ,i)) x-s i-s)
(let ((%temp% (begin ,@b)))
,@(map (lambda (x old-x) `(set! ,x ,old-x)) x-s old-x-s)
%temp%))))